package classi;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.TreeSet;

import interfacce.AccountManager;

public class AccountManagerImpl extends UnicastRemoteObject implements AccountManager {

	

	/**
	 * 
	 */
	private static final long serialVersionUID = -6408670406448885694L;
	
	
	private TreeSet<Docente> listaDocenti =null;
	private TreeSet<Studente> listaStudenti=null;
	private static AccountManagerImpl ami = null; //SINGLETON
	
	private AccountManagerImpl() throws RemoteException {
		this.listaDocenti = new TreeSet<Docente>();
		this.listaStudenti = new TreeSet<Studente>();
		
	}
	
	public static synchronized AccountManagerImpl getInstance() throws RemoteException{ //SINGLETON 
		if(ami==null){
			try {
				ami = new AccountManagerImpl();
			} catch (RemoteException e) {
				System.out.println("PROBLEMI ACCOUNT MANAGER");
				e.printStackTrace();
			}
			return ami;
		}
		return ami;
	}


	private Object readResolve() throws RemoteException{ // per risolvere alcuni problemi di serializzazione 
		return getInstance();
	}

	@Override
	public Studente loginAsStudente(String username, String password) throws RemoteException{
		Studente ris=null;
		for(Studente s : listaStudenti ){
			if( s.getUsername().equals(username) && s.getPassword().equals(password) )
			ris = s;
		}//for
		return ris; //se ris e' rimasto null username o password errati o non registrato
	}

	@Override
	public Docente loginAsDocente(String username, String password)throws RemoteException {
		Docente ris=null;
		for(Docente d : listaDocenti){
			if(d.getUsername().equals(username) && d.getPassword().equals(password))
				ris = d;
		}//for
		return ris; //se ris e' rimasto null username o password errati o non registrato
	}
	
	@Override
	public void nuovoDocente(Docente d) throws RemoteException {
		listaDocenti.add(d);
		
	}

	

	@Override
	public void nuovoDocente(String username, String password, String nome,
			String cognome, String cf)throws RemoteException {
		Docente d = new Docente(username, password, nome, cognome, cf);
		listaDocenti.add(d);
		
	}

	@Override
	public boolean modificaDocente(Docente docente,String nome, String cognome, String cf) throws RemoteException{
		for(Docente d : listaDocenti){
			if(d.equals(docente)){
				d.setNome(nome);
				d.setCognome(cognome);
				d.setCf(cf);
				return true;
			}//if
		}//for
		return false;
	}

	@Override
	public boolean eliminaDocente(String cf) throws RemoteException{
		for(Docente d : listaDocenti){
			if(d.getCf().equals(cf)){
			listaDocenti.remove(d);
			return true;
		  }//if
		}//for
		return false;
	}

	@Override
	public boolean eliminaDocente(Docente docente)throws RemoteException {
		for(Docente d : listaDocenti){
			if(d.equals(docente)){
				listaDocenti.remove(d);
				return true;
			}//if
		}//for
		return false;
	}

	@Override
	public boolean ePresenteDocente(Docente docente)throws RemoteException {
		for(Docente d : listaDocenti){
			if(d.equals(docente)){
				return true;
			}//if
		}//for
		return false;
	}
	
	@Override
	public void nuovoStudente(Studente s) throws RemoteException {
		listaStudenti.add(s);
		
	}

	@Override
	public void nuovoStudente(String username, String password, String nome,
			String cognome, String cf)throws RemoteException {
		Studente s = new Studente(username, password, nome, cognome, cf);
		listaStudenti.add(s);
		
	}

	@Override
	public boolean modificaStudente(Studente studente,String nome, String cognome, String cf,
			String matricola)throws RemoteException {
		for(Studente s : listaStudenti ){
			if(s.equals(studente)){
				s.setNome(nome);
				s.setCognome(cognome);
				s.setCf(cf);
				return true;
			}
		}//for
		return false;
	}

	@Override
	public boolean eliminaStudente(String cf)throws RemoteException {
		for(Studente s : listaStudenti ){
			if(s.getCf().equals(cf)){
				listaStudenti.remove(s);
				return true;
			}//if
		}//for
		return false;
	}

	@Override
	public boolean eliminaStudente(Studente studente)throws RemoteException {
		for(Studente s : listaStudenti ){
			if(s.equals(studente)){
				listaStudenti.remove(s);
				return true;
			}//if
		}//for
		return false;
	}

	@Override
	public boolean ePresenteStudente(Studente studente)throws RemoteException {
		for(Studente s : listaStudenti ){
			if(s.equals(studente)){
				return true;
			}//if		
		}//for
			return false;
	}

	@Override
	public TreeSet<Docente> getListaDocenti()throws RemoteException {
		return listaDocenti;
	}

	@Override
	public void setListaDocenti(TreeSet<Docente> listaDocenti) throws RemoteException{
		this.listaDocenti = listaDocenti;
	}

	@Override
	public TreeSet<Studente> getListaStudenti()throws RemoteException {
		return listaStudenti;
	}

	@Override
	public void setListaStudente(TreeSet<Studente> listaStudenti) throws RemoteException{
		this.listaStudenti=listaStudenti;
		
	}
	
	@Override
	public String toString() {
		StringBuilder sb = new StringBuilder();
		sb.append("STUDENTI REGISTRATI:\n");
		sb.append(listaStudenti.toString() +"\n");
		sb.append("DOCENTI REGISTRATI:\n");
		sb.append(listaDocenti.toString() +"\n");
		return super.toString();
	}

	
	
}
